package com.yzqp.common.mvc;


import com.alibaba.fastjson.JSON;
import com.yzqp.common.consts.RedisConst;
import com.yzqp.common.exception.GlobalRuntimeException;
import com.yzqp.common.log.LogUtil;
import com.yzqp.common.result.WebJsonResultUtil;
import com.yzqp.common.util.FastJsonUtil;
import com.yzqp.common.util.RedisUtil;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class YzqpUtils {


//    /**
//     * 获取请求对象
//     *
//     * @return
//     */
//    public static HttpServletRequest getServletRequest() {
//        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//    }
//
//    //    生成订单编号（18位)
//    public static String genOrderSn() {
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
//        String newDate = sdf.format(new Date());
//        String result = "";
//        Random random = new Random();
//        for (int i = 0; i < 3; i++) {
//            result += random.nextInt(10);
//        }
//        return newDate + result;
//    }
//
//    public static Member getUserInfo() {
//        Member member = (Member) YzqpUtils.getServletRequest().getAttribute("userinfo");
//        if (member == null) {
//            throw new GlobalRuntimeException("无法通过token找到目标用户", WebJsonResultUtil.LOGIN_ERR);
//        }
//        return (Member) YzqpUtils.getServletRequest().getAttribute("userinfo");
//    }
//
//    public static Member getUserInfoCanNull() {
//        Member member = (Member) YzqpUtils.getServletRequest().getAttribute("userinfo");
//        return member;
//    }
//
//    public static void setUserInfo(Member member) {
//        YzqpUtils.getServletRequest().setAttribute("userinfo", member);
//    }
//
//    public static String getToken() {
//        String token = (String) YzqpUtils.getServletRequest().getAttribute("token");
//        return token;
//    }
//
//    public static Member getRedisUserInfo(String token) {
//        String userInfo = (String) RedisUtil.get(RedisConst.USER_TOKEN + token);
//        if (userInfo == null) {
//            return null;
//        }
//        return (Member) FastJsonUtil.stringToObject(userInfo, Member.class);
//    }
//
//
//    /**
//     * 获取用户真实IP地址，不使用request.getRemoteAddr()的原因是有可能用户使用了代理软件方式避免真实IP地址,
//     * 可是，如果通过了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP值
//     *
//     * @return ip
//     */
//    public static String getIpAddr(HttpServletRequest request) {
//        String ip = request.getHeader("x-forwarded-for");
//        LogUtil.getBean().info("x-forwarded-for ip: " + ip);
//        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
//            // 多次反向代理后会有多个ip值，第一个ip才是真实ip
//            if (ip.indexOf(",") != -1) {
//                ip = ip.split(",")[0];
//            }
//        }
//        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
//            ip = request.getHeader("Proxy-Client-IP");
////            YzLogUtil.getBean().error("Proxy-Client-IP ip: " + ip);
//        }
//        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
//            ip = request.getHeader("WL-Proxy-Client-IP");
////            YzLogUtil.getBean().error("WL-Proxy-Client-IP ip: " + ip);
//        }
//        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
//            ip = request.getHeader("HTTP_CLIENT_IP");
////            YzLogUtil.getBean().error("HTTP_CLIENT_IP ip: " + ip);
//        }
//        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
//            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
////            YzLogUtil.getBean().error("HTTP_X_FORWARDED_FOR ip: " + ip);
//        }
//        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
//            ip = request.getHeader("X-Real-IP");
////            YzLogUtil.getBean().error("X-Real-IP ip: " + ip);
//        }
//        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
//            ip = request.getRemoteAddr();
////            YzLogUtil.getBean().error("getRemoteAddr ip: " + ip);
//        }
////        YzLogUtil.getBean().error("获取客户端ip: " + ip);
//        return ip;
//    }
//
//    // get请求
//    public static String httpGet(String url) {
//        return httpGet(url, null);
//    }
//
//    public static String httpGet(String url, Map<String, Object> params) {
//        if (params == null) {
//            params = new HashMap<>();
//        }
//
//        for (String key : params.keySet()) {
//            if (url.indexOf('?') > 0) {
//                url += "&" + key + "=" + params.get(key).toString();
//            } else {
//                url += "?" + key + "=" + params.get(key).toString();
//            }
//        }
//
//        RestTemplate rest = new RestTemplate();
//        rest.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
//
//        LogUtil.getBean().info("url = " + url);
//        return rest.getForObject(url, String.class);
//    }
//
//    // post请求
//    public static String httpPost(String url, Map<String, Object> params, HttpHeaders headers) {
//        if (headers == null) {
//            headers = new HttpHeaders();
//        }
//
//        if (params == null) {
//            params = new HashMap<>();
//        }
//
//        MultiValueMap<String, Object> postParams = new LinkedMultiValueMap<>();
//        for (Map.Entry<String, Object> entry : params.entrySet()) {
//            postParams.add(entry.getKey(), entry.getValue());
//        }
//        RestTemplate rest = new RestTemplate();
//        rest.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
//
//        HttpEntity entity = new HttpEntity(postParams, headers);
//        try {
//            ResponseEntity<String> res = rest.postForEntity(url, entity, String.class);
//            return res.getBody();
//        } catch (Exception e) {
//            LogUtil.getBean().error(e.getMessage());
//            return "";
//        }
//    }
//
//    // post请求
//    public static String httpPostJson(String url, Map<String, Object> params, HttpHeaders headers) {
//        if (headers == null) {
//            headers = new HttpHeaders();
//        }
//        headers.setContentType(MediaType.APPLICATION_JSON);
//
//        if (params == null) {
//            params = new HashMap<>();
//        }
//
//        RestTemplate rest = new RestTemplate();
//        rest.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
//
//        HttpEntity entity = new HttpEntity(JSON.toJSONString(params), headers);
//        try {
//            ResponseEntity<String> res = rest.postForEntity(url, entity, String.class);
//            return res.getBody();
//        } catch (Exception e) {
//            LogUtil.getBean().error(e.getMessage());
//            return "";
//        }
//    }

}
